<?php

namespace app\controller\crm;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class Contact extends BaseController
{
    /**
     * 获取联系人列表
     */
    public function list()
    {
        $params = Request::param();
        $customerId = $params['customer_id'] ?? 0;
        $page = $params['page'] ?? 1;
        $limit = $params['limit'] ?? 20;
        
        $query = Db::name('crm_contact')
            ->alias('c')
            ->field('c.*, cu.name as customer_name, u.name as user_name')
            ->leftJoin('crm_customer cu', 'c.customer_id = cu.id')
            ->leftJoin('admin u', 'c.user_id = u.id')
            ->where('c.delete_time', 0);
            
        if ($customerId) {
            $query->where('c.customer_id', $customerId);
        }
        
        // 数据权限控制
        $userId = $this->getUserId();
        if ($userId > 0 && !$customerId) {
            // 只有在未指定customer_id时才进行权限控制
            // 如果指定了customer_id，说明是从客户详情或销售机会中查询，直接返回该客户的所有联系人

            // 获取当前用户信息
            $userInfo = Db::name('admin')
                ->field('id, group_id, did')
                ->where('id', $userId)
                ->find();

            if ($userInfo && $userInfo['group_id'] != 1) {
                // 非超级管理员，通过联系人的user_id过滤
                if ($userInfo['group_id'] == 2) {
                    // 部门经理：查看本部门创建的联系人
                    $query->join('admin u2', 'c.user_id = u2.id', 'LEFT')
                          ->where('u2.did', $userInfo['did']);
                } elseif ($userInfo['group_id'] > 2) {
                    // 销售人员：只能查看自己创建的联系人
                    $query->where('c.user_id', $userId);
                }
            }
        }
        
        $total = $query->count();
        $list = $query->order('c.create_time', 'desc')
            ->page($page, $limit)
            ->select();
        
        // 格式化时间字段
        $list = $list ? $list->toArray() : [];
        foreach ($list as &$item) {
            $item['create_time'] = $item['create_time'] ? date('Y-m-d H:i:s', $item['create_time']) : '';
            $item['update_time'] = $item['update_time'] ? date('Y-m-d H:i:s', $item['update_time']) : '';
        }
            
        return $this->paginate($list, $total, (int)$page, (int)$limit);
    }
    
    /**
     * 添加联系人
     */
    public function add()
    {
        $params = Request::param();
        $userId = $this->getUserId();
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        // 检查客户是否存在
        $customer = Db::name('crm_customer')
            ->where('id', $params['customer_id'])
            ->where('delete_time', 0)
            ->find();
            
        if (!$customer) {
            return $this->error('客户不存在');
        }
        
        // 检查权限
        if ($customer['user_id'] != $userId) {
            // 获取用户信息判断权限
            $userInfo = Db::name('admin')
                ->field('id, group_id, did')
                ->where('id', $userId)
                ->find();
            
            if (!$userInfo || (isset($userInfo['group_id']) && $userInfo['group_id'] > 2)) {
                return $this->error('无权限添加联系人');
            }
        }
        
        $data = [
            'customer_id' => $params['customer_id'],
            'name' => $params['name'],
            'position' => $params['position'] ?? '',
            'phone' => $params['phone'] ?? '',
            'wechat' => $params['wechat'] ?? '',
            'email' => $params['email'] ?? '',
            'is_primary' => $params['is_primary'] ?? 0,
            'user_id' => $userId,
            'create_time' => time(),
            'update_time' => time()
        ];
        
        // 如果设置为主要联系人，取消其他主要联系人
        if ($data['is_primary'] == 1) {
            Db::name('crm_contact')
                ->where('customer_id', $params['customer_id'])
                ->where('is_primary', 1)
                ->update(['is_primary' => 0]);
        }
        
        $id = Db::name('crm_contact')->insertGetId($data);
        
        if ($id) {
            return $this->success(['id' => $id], '添加成功');
        }
        
        return $this->error('添加失败');
    }
    
    /**
     * 编辑联系人（需要审核）
     */
    public function edit()
    {
        $params = Request::param();
        $id = $params['id'];
        $userId = $this->getUserId();
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        $contact = Db::name('crm_contact')->where('id', $id)->find();
        if (!$contact) {
            return $this->error('联系人不存在');
        }
        
        // 检查权限
        if ($contact['user_id'] != $userId) {
            // 获取用户信息判断权限
            $userInfo = Db::name('admin')
                ->field('id, group_id, did')
                ->where('id', $userId)
                ->find();
            
            if (!$userInfo || (isset($userInfo['group_id']) && $userInfo['group_id'] > 2)) {
                return $this->error('无权限编辑');
            }
        }
        
        // 检查是否有待审核的修改申请
        $pendingReview = Db::name('crm_contact_review')
            ->where('contact_id', $id)
            ->where('status', 1)
            ->find();
            
        if ($pendingReview) {
            return $this->error('该联系人已有待审核的修改申请，请等待审核完成');
        }
        
        // 创建审核记录
        $reviewData = [
            'contact_id' => $id,
            'customer_id' => $contact['customer_id'],
            'user_id' => $userId,
            'original_data' => json_encode($contact),
            'new_data' => json_encode($params),
            'review_type' => 2, // 编辑
            'status' => 1, // 待审核
            'create_time' => time(),
            'update_time' => time()
        ];
        
        $reviewId = Db::name('crm_contact_review')->insertGetId($reviewData);
        
        if ($reviewId) {
            return $this->success('修改申请已提交，等待管理员审核');
        }
        
        return $this->error('提交审核失败');
    }
    
    /**
     * 删除联系人（需要审核）
     */
    public function del()
    {
        $params = Request::param();
        $id = $params['id'];
        $userId = $this->getUserId();
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        $contact = Db::name('crm_contact')->where('id', $id)->find();
        if (!$contact) {
            return $this->error('联系人不存在');
        }
        
        // 检查权限
        if ($contact['user_id'] != $userId) {
            // 获取用户信息判断权限
            $userInfo = Db::name('admin')
                ->field('id, group_id, did')
                ->where('id', $userId)
                ->find();
            
            if (!$userInfo || (isset($userInfo['group_id']) && $userInfo['group_id'] > 2)) {
                return $this->error('无权限删除');
            }
        }
        
        // 检查是否有待审核的删除申请
        $pendingReview = Db::name('crm_contact_review')
            ->where('contact_id', $id)
            ->where('status', 1)
            ->where('review_type', 3) // 删除
            ->find();
            
        if ($pendingReview) {
            return $this->error('该联系人已有待审核的删除申请，请等待审核完成');
        }
        
        // 创建删除审核记录
        $reviewData = [
            'contact_id' => $id,
            'customer_id' => $contact['customer_id'],
            'user_id' => $userId,
            'original_data' => json_encode($contact),
            'new_data' => '',
            'review_type' => 3, // 删除
            'status' => 1, // 待审核
            'create_time' => time(),
            'update_time' => time()
        ];
        
        $reviewId = Db::name('crm_contact_review')->insertGetId($reviewData);
        
        if ($reviewId) {
            return $this->success('删除申请已提交，等待管理员审核');
        }
        
        return $this->error('提交审核失败');
    }
    
    /**
     * 设置主要联系人
     */
    public function setPrimary()
    {
        $params = Request::param();
        $id = $params['id'];
        $userId = $this->getUserId();
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        $contact = Db::name('crm_contact')->where('id', $id)->find();
        if (!$contact) {
            return $this->error('联系人不存在');
        }
        
        // 检查权限
        if ($contact['user_id'] != $userId) {
            // 获取用户信息判断权限
            $userInfo = Db::name('admin')
                ->field('id, group_id, did')
                ->where('id', $userId)
                ->find();
            
            if (!$userInfo || (isset($userInfo['group_id']) && $userInfo['group_id'] > 2)) {
                return $this->error('无权限操作');
            }
        }
        
        // 取消其他主要联系人
        Db::name('crm_contact')
            ->where('customer_id', $contact['customer_id'])
            ->where('is_primary', 1)
            ->update(['is_primary' => 0]);
        
        // 设置当前联系人为主要联系人
        $result = Db::name('crm_contact')
            ->where('id', $id)
            ->update([
                'is_primary' => 1,
                'update_time' => time()
            ]);
            
        if ($result) {
            return $this->success('设置成功');
        }
        
        return $this->error('设置失败');
    }
    
    /**
     * 获取联系人详情
     */
    public function detail()
    {
        $params = Request::param();
        $id = $params['id'];
        
        $contact = Db::name('crm_contact')
            ->alias('c')
            ->field('c.*, cu.name as customer_name, u.name as user_name')
            ->leftJoin('crm_customer cu', 'c.customer_id = cu.id')
            ->leftJoin('admin u', 'c.user_id = u.id')
            ->where('c.id', $id)
            ->where('c.delete_time', 0)
            ->find();
            
        if (!$contact) {
            return $this->error('联系人不存在');
        }
        
        // 格式化时间字段
        $contact['create_time'] = $contact['create_time'] ? date('Y-m-d H:i:s', $contact['create_time']) : '';
        $contact['update_time'] = $contact['update_time'] ? date('Y-m-d H:i:s', $contact['update_time']) : '';
        
        return $this->success($contact, '获取成功');
    }
    
    /**
     * 获取联系人审核列表（管理员用）
     */
    public function reviewList()
    {
        $userId = $this->getUserId();
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        // 检查是否为管理员
        if (!$this->checkSuperAdmin()) {
            return $this->error('无权限访问');
        }
        
        $params = Request::param();
        $page = $params['page'] ?? 1;
        $limit = $params['limit'] ?? 20;
        $status = $params['status'] ?? '';
        
        $query = Db::name('crm_contact_review')
            ->alias('r')
            ->field('r.*, u.name as user_name, c.name as contact_name, cu.name as customer_name')
            ->leftJoin('admin u', 'r.user_id = u.id')
            ->leftJoin('crm_contact c', 'r.contact_id = c.id')
            ->leftJoin('crm_customer cu', 'r.customer_id = cu.id');
        
        if ($status !== '') {
            $query->where('r.status', $status);
        }
        
        $total = $query->count();
        $list = $query->order('r.create_time', 'desc')
            ->page($page, $limit)
            ->select();
        
        // 处理列表数据
        $list = $list ? $list->toArray() : [];
        foreach ($list as &$item) {
            // 如果字段为空，从new_data中解析
            if (!empty($item['new_data'])) {
                $newData = json_decode($item['new_data'], true);
                if (empty($item['contact_name'])) {
                    $item['contact_name'] = $newData['name'] ?? '';
                }
                if (empty($item['customer_name']) && isset($newData['customer_id'])) {
                    $customer = Db::name('crm_customer')->where('id', $newData['customer_id'])->find();
                    $item['customer_name'] = $customer['name'] ?? '';
                }
            }
            
            // 格式化时间
            $item['create_time'] = $this->formatTime($item['create_time']);
            $item['update_time'] = $this->formatTime($item['update_time']);
        }
        
        return $this->paginate($list, $total, (int)$page, (int)$limit);
    }
    
    /**
     * 审核联系人（管理员用）
     */
    public function reviewApprove()
    {
        $params = Request::param();
        $reviewId = $params['id'];
        $userId = $this->getUserId();
        $status = $params['status']; // 2-通过 3-驳回
        $remark = $params['remark'] ?? '';
        
        if (!$userId) {
            return $this->error('未登录或登录已过期', 401);
        }
        
        // 检查是否为管理员
        if (!$this->checkSuperAdmin()) {
            return $this->error('无权限审核');
        }
        
        // 获取审核记录
        $review = Db::name('crm_contact_review')->where('id', $reviewId)->find();
        if (!$review) {
            return $this->error('审核记录不存在');
        }
        
        if ($review['status'] != 1) {
            return $this->error('该申请已审核');
        }
        
        // 开启事务
        Db::startTrans();
        try {
            // 更新审核记录
            Db::name('crm_contact_review')
                ->where('id', $reviewId)
                ->update([
                    'status' => $status,
                    'review_user_id' => $userId,
                    'review_time' => date('Y-m-d H:i:s'),
                    'review_remark' => $remark,
                    'update_time' => date('Y-m-d H:i:s')
                ]);
            
            // 如果审核通过，执行相应操作
            if ($status == 2) {
                if ($review['review_type'] == 2) {
                    // 编辑联系人
                    $newData = json_decode($review['new_data'], true);
                    $newData['update_time'] = date('Y-m-d H:i:s');
                    
                    Db::name('crm_contact')
                        ->where('id', $review['contact_id'])
                        ->update($newData);
                } else if ($review['review_type'] == 3) {
                    // 删除联系人
                    Db::name('crm_contact')
                        ->where('id', $review['contact_id'])
                        ->update(['delete_time' => date('Y-m-d H:i:s')]);
                }
            }
            
            Db::commit();
            return $this->success($status == 2 ? '审核通过' : '审核驳回');
        } catch (\Exception $e) {
            Db::rollback();
            return $this->error('审核失败：' . $e->getMessage());
        }
    }
    
    /**
     * 格式化时间
     */
    private function formatTime($time)
    {
        if (empty($time)) {
            return '';
        }
        
        // 如枟是时间戳
        if (is_numeric($time)) {
            return date('Y-m-d H:i:s', $time);
        }
        
        // 如果是日期时间字符串
        if (is_string($time)) {
            $timestamp = strtotime($time);
            if ($timestamp !== false) {
                return date('Y-m-d H:i:s', $timestamp);
            }
        }
        
        return $time;
    }
}